public class Test {
    //字符串的截取：返回的是一个新的字符串类型在堆上创建了一个新的对象的空间
    //substring方法
    public static void main1(String[] args) {
        String s = "abcdef";
        String ret = s.substring(1);//从下标1开始进行索引：
        System.out.println(ret);
        //如果传入的是0的下标，那么默认返回的是原来的对象
        //但是如果传入的是其他的对象，此时返回了是新的对象
        System.out.println("===========");

        String ret2 = s.substring(1,4);
        //从[1,4)开始截取（我们在Java中的区间默认都是左闭右开区间）
        System.out.println(ret2);//打印到了下标为3的位置

        /*
        String substring(int beginIndex) 从指定位置索引截取到结尾
        String substring(int beginIndex, int endIndex) 截取部分内容
         */
    }

    //trim()方法：去掉字符串中的左右空格,保留中间空格
    public static void main2(String[] args) {
        String s2 = "   abc   def   ";
        System.out.println(s2);
        String ret = s2.trim();
        System.out.println(ret);
        //通过打印结果可以发现这个时候并没有去除这个字符串的中间的空格
        //所以他表示了能去除字符串两端的空格，而中间的空格去不掉
    }

    /**
     * 关于ToUpperCase和ToLowerCase这个方法的补充：
     * 它仅能在英文下才可进行大写小写字母转换，其余的按原来的直接打印
     */

    /*关于字符串的不可变性：

    这个是一部分的String源码：
    public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    // The value is used for character storage. *
    private final char value[];

    我们知道final修饰的引用类型是不可改变这个引用类型在堆中的指向的空间，所以数组可以改变的它的元素的值，不改变对象的地址和空间
    但是这个时候我们会有一定的疑问，那为什么能修改字符数组元素的值，为什么还会不可变呢！
    因为被private修饰，所以无法在外部进行访问String类下的value字符数组，所以外部类也无法去修改和获得这个字符数组

    value被修饰被ﬁnal修饰，表明value自身的值不能改变，即不能引用其它字符数组，但是其引用空间中
    的内容可以修改。
    final修饰类表明该类不想被继承，ﬁnal修饰引用类型表明该引用变量不能引用其他对象，但是其引用对象中的内
    容是可以修改的。
     */

    /**
     * 为什么 String 要设计成不可变的?(不可变对象的好处是什么?) (选学)后续会讲
     * 1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
     * 2. 不可变对象是线程安全的.
     * 3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.
     */

    //字符串拼接： 可以用自加来拼接但是会造成系统运行缓慢
    public static void main(String[] args) {
     String s = "hello";
     s += " world";
     System.out.println(s); // 输出：hello world
    }

    /*
    注意：
    尽量避免直接对String类型对象进行修改，因为String类是不能修改的，所有的修改都会创建新对象，效率
    非常低下。
    我们一般用StringBuilder和StringBuffer类来进行修改的操作，但是也是创建新的对象
    */
}
